<?php

class Listas_Model_DiligenciarListas extends Model_Cna {
	
	
	public function __construct() {
		parent::__construct();
	}
	
	/**
	 * Retorna en un array los datos del trámite de una lista
	 * @param integer $codproceso Código del proceso
	 * @return array
	 */
	public function getTramiteLista($codproceso,$codlista) {
		$Table = new Listas_Model_DbTable_Tramitelistas();
		return $Table->getTramiteLista($codproceso,$codlista);
	}
	
	/**
	 * Almacena los datos del trámite de una lista
	 * @param Array $datos Los datos del registro
	 */
	public function guardarTramiteLista($datos) {
		$Table = new Listas_Model_DbTable_Tramitelistas();

		if(isset($datos["codtramitelista"]) && !empty($datos["codtramitelista"])) {
			$row = $Table->find($datos["codtramitelista"])->current();
			return $row->setFromArray($datos)->save();
		} else {
			unset($datos["codtramitelista"]);
			$key = $Table->createRow($datos)->save();
			return $key;
		}
	}
	/**
	 * Retorna el listado de secciones para diligenciar
	 * @param Array $datos Datos de la búsqueda y creación
	 * @return Array
	 */
	public function getDiligenciaTramiteLista($datos,$opcion){
	    $Table = new Listas_Model_DbTable_Tramitelistas();
		$datos_tramite = $this->getTramiteLista($datos["codproceso"],$datos["codlista"]);
		$datos["codtramitelista"] = $datos_tramite["codtramitelista"];
		if(empty($datos["codtramitelista"])){
		    $datos["codtramitelista"]= $this->guardarTramiteLista($datos);
		    $this->crearDiligenciaTramiteLista($datos);
		}
		
		switch($opcion){
            case 1: //Trae las secciones
		        return $Table->getSeccionesDiligenciaTramiteLista($datos["codtramitelista"]);
		    break;
            case 2: //Trae los elementos
		        return $Table->getElementosDiligenciaTramiteLista($datos["codtramitelista"],$datos["codseccionlista"]);
		    break;
		    case 3: //Trae TODO
		        return $Table->getDiligenciaTramiteLista($datos["codtramitelista"]);
		    break;
		}
	}
	/**
	 * Crea el trámite para la diligencia de la listas
	 * @param Array $datos Datos para la creación del trámite
	 */
	public function crearDiligenciaTramiteLista($datos){
	    $Table = new Listas_Model_DbTable_Tramitelistas();
	    $Table->crearDiligenciaTramiteLista($datos);
	}
	
	/**
	 * Almacena los datos del trámite de una seeción de lista
	 * @param Array $datos Los datos del registro
	 */
	public function guardarTramiteSeccion($datos) {
		$Table = new Listas_Model_DbTable_Tramiteseccion();

		if(isset($datos["codtramiteseccion"]) && !empty($datos["codtramiteseccion"])) {
			$row = $Table->find($datos["codtramiteseccion"])->current();
			return $row->setFromArray($datos)->save();
		} else {
			unset($datos["codtramiteseccion"]);
			$key = $Table->createRow($datos)->save();
			return $key;
		}
	}
	
	/**
	 * Almacena los datos del trámite de un elemento de lista
	 * @param Array $datos Los datos del registro
	 */
	public function guardarTramiteElemento($datos) {
		$Table = new Listas_Model_DbTable_Tramiteelemento();
		$datos = $this->forceEmptyAsNull($datos);

		if(isset($datos["codtramiteelemento"]) && !empty($datos["codtramiteelemento"])) {
			$row = $Table->find($datos["codtramiteelemento"])->current();
			return $row->setFromArray($datos)->save();
		} else {
			unset($datos["codtramiteelemento"]);
			$key = $Table->createRow($datos)->save();
			return $key;
		}
	}
	
	/**
	 * Calcula y actualiza la valoración de una sección
	 * @param Integer $codtramiteelemento Código del trámite del elemento
	 * @param Integer $codtramiteseccion Código del trámite de la sección
	 * @param Integer $codlista Código de la lista
	 * @param String $realizaponderacion S/N Si realiza ponderación al programa
	 */
	
	public function actualizarValoracionSeccion($codtramiteelemento,$codtramiteseccion,$codlista,$realizaponderacion="S"){
        $Table = new Listas_Model_DbTable_Tramiteelemento();
        $promedio = $Table->obtenerPromedioelementos($codtramiteelemento,$realizaponderacion);
        $datos["valoracion"] = round($promedio["promedio"],2);
        
	    $escalasService = new Listas_Model_Escalas();
	    $escala = $escalasService->getEscalaGradacionValorPeso($codlista, $datos["valoracion"]);
	    $datos["codescala"] = $escala["codescala"];
	    $datos["codtramiteseccion"] = $codtramiteseccion;
        $this->guardarTramiteSeccion($datos);
	}
	
	/**
	 * Retorna la valoración global
	 * @param Integer $codtramitelista Código del trámite de la lista
	 * @param Integer $codlista Código de la lista
	 */
	
	public function actualizarValoracionGlobal($codtramitelista,$codlista){
        $Table = new Listas_Model_DbTable_Tramiteelemento();
        $promedio = $Table->obtenerPromediosecciones($codtramitelista);
        $datos["valoracion"] = round($promedio["promedio"],2);
        
	    $escalasService = new Listas_Model_Escalas();
	    $escala = $escalasService->getEscalaGradacionValorPeso($codlista, $datos["valoracion"]);
	    return $escala["nombre"];
//	    $datos["codescala"] = $escala["codescala"];
//	    $datos["codtramitelista"] = $codtramitelista;
//        $this->guardarTramiteLista($datos);
	}
	
	/**
	 * Elimina el documento adjunto de una sección
	 * @param integer Código del documento
	 */
	public function eliminarAdjuntoSeccion($coddocumento) {
        $adjunto = new Generales_Model_Documentos();
	    $adjunto->eliminarDocumento($coddocumento);
	}
	/**
	 * Almacena los datos de un archivo adjunto a una seccion
	 * @param array $datos Los datos para el registro
	 */
	public function guardarAdjuntoSeccion($datos) {
		$adjuntoTable = new Generales_Model_DbTable_Documentos();
	    $adjuntoTable->getAdapter()->beginTransaction();
		try {
			$key = $adjuntoTable->createRow($datos)->save();
			$datos_rel["coddocumento"] = $key;
			$datos_rel["codtramiteseccion"] = $datos["codtramiteseccion"];
			$adjuntoTable->getAdapter()->insert("documentostramiteseccion", $datos_rel);
			$adjuntoTable->getAdapter()->commit();
		} catch(Exception $e) {
			$adjuntoTable->getAdapter()->rollBack();
			throw $e;
		}
	}
	
	/**
	 * Obtiene un array con la lista de documentos adjuntos de una seccion
	 * @param $codsintesis Código de la síntesis
	 * @return array
	 */
	public function getAdjuntosSeccion($codtramiteseccion) {
		$SolicitudTable = new Listas_Model_DbTable_Tramiteseccion();
		return $SolicitudTable->getAdjuntosSeccion($codtramiteseccion);
	}
	
	/**
	 * Carga los datos que se visualizan en el formulario de ponderación
	 * @param Array $datos Datos para cargar en el formulario de ponderación
	 * @param Integer $criterio
	 * @return Array con los datos como se deben cargar en el formulario
	 */
	public function CargarDatosForm($datos,$criterio){
        switch($criterio){
            case "PONDERACION":
			    $datos_form["totalpeso"]=0;
			    foreach($datos as $key =>$valor){
			        $codigo = "codtramiteelemento";
				    if (isset($valor["codtramiteseccion"])):
				        $codigo = "codtramiteseccion";
			        endif;
			        $datos_form["peso_{$valor[$codigo]}"]=$valor["peso"];
			        $datos_form["justificacionpeso_{$valor[$codigo]}"]=$valor["justificacionpeso"];
			        $datos_form["totalpeso"] +=$valor["peso"];
			    }
		    break;
		    case "COMPLETITUD":
        	    foreach($datos as $key =>$valor){
			        $codigo = "codtramiteelemento";
			        $datos_form["codescala_{$valor[$codigo]}"]=$valor["codescala"];
			        $datos_form["justificacionvaloracion_{$valor[$codigo]}"]=$valor["justificacionvaloracion"];
			    }
		    break;
        }
	    return $datos_form;
	}
	/**
	 * Valida que la suma de los pesos digitados no supere el 100%
	 * @param Array $datos datos del formulario con los pesos
	 * @return Booleam
	 */
	public function validarTotalPeso($datos){
	    $suma = 0;
	    foreach($datos as $key => $valor){
	        list($campo) = explode("_",$key);
		    if ($campo=="peso"){
		        $suma += $valor;
		    }
	    }
	    if ($suma>100 || $suma<100 ) return false;
	    else return true;
	      
	}
	
	/**
	 * Verifica que la información solicitada este diligenciada
	 * @param Array $datos Datos de la búsqueda y creación
	 * @return Booleam
	 */
	public function verificarCompletitud($codigo,$codtramitelista,$opcion){
	    $Table = new Listas_Model_DbTable_Tramitelistas();
		
		switch($opcion){
            case 1: //Verifica que todos los elementos de las sección estes diligenciados
		        $verificar = $Table->verificarElementosSeccion($codigo,$codtramitelista);
		        return ($verificar["cantidad"]=="0")?true:false;
		    break;
		}
	}
	/**
	 * Verifica que la información solicitada de ponderacioón este diligenciada
	 * @param Integer $codseccionlista Código de la sección
	 * @param Integer $codtramitelista Código de la lista diligenciada
	 * @return Booleam
	 */
	public function verificarPonderacionElementosSeccion($codseccionlista,$codtramitelista){
	    $Table = new Listas_Model_DbTable_Tramitelistas();
          $verificar = $Table->verificarPonderacionElementosSeccion($codseccionlista,$codtramitelista);
        return ($verificar["cantidad"]=="0")?true:false;
	}
	
	/**
	 * Verifica que toda la información solicitada de ponderacioón este diligenciada
	 * @param Integer $codtramitelista Código de la lista diligenciada
	 * @return Booleam
	 */
	public function verificarPonderacion($codtramitelista){
	    $Table = new Listas_Model_DbTable_Tramitelistas();
          $verificar = $Table->verificarPonderacion($codtramitelista);
        return ($verificar["cantidad"]=="0")?true:false;
	}
	/**
	 * Verifica que la información solicitada este diligenciada
	 * @param Integer $codtramitelista Código de la lista diligenciada
	 * @return Booleam
	 */
	public function verificarValoracion($codtramitelista){
	    $Table = new Listas_Model_DbTable_Tramitelistas();
        $verificar = $Table->verificarValoracion($codtramitelista);
        return ($verificar["cantidad"]=="0")?true:false;
	}
	
	/**
	 * Verifica que la información para la autoevaluacion solicitada este diligenciada
	 * @param Integer $codtramitelista Código de diligenciamiento de la lista
	 * @return Booleam
	 */
	public function verificarInformacionAutoevaluacion($codtramitelista){
	    $Table = new Listas_Model_DbTable_Tramitelistas();
        $verificar = $Table->verificarInformacionAutoevaluacion($codtramitelista);
        return ($verificar["cantidad"]=="0")?true:false;
	}
	
	
	/**
	 * Almacena los datos de un archivo adjunto a un  trámite
	 * @param array $datos Los datos del para el registro
	 */
	public function guardarAdjuntoTramite($datos) {
		$adjuntoTable = new Generales_Model_DbTable_Documentos();
	    $adjuntoTable->getAdapter()->beginTransaction();
		try {
			$key = $adjuntoTable->createRow($datos)->save();
			$SolicitudTable = new Solicitudes_Model_DbTable_Sintesis();
			$datos_rel["coddocumento"] = $key;
			$datos_rel["codtramitelista"]  = $datos["codtramitelista"];
			$datos_rel["nombre"]  = $datos["nombre"];
			$datos_rel["descripcion"]  = $datos["descripcion"];
			$SolicitudTable->getAdapter()->insert("documentostramitelista_cna", $datos_rel);
			$adjuntoTable->getAdapter()->commit();
		} catch(Exception $e) {
			$adjuntoTable->getAdapter()->rollBack();
			throw $e;
		}
	}
	
	/**
	 * Obtiene un array con la lista de documentos adjuntos de un trámite
	 * @param Integer $codtramitelista Código del trámite
	 * @return array
	 */
	public function getAdjuntosTramite($codtramitelista) {
		$Table = new Listas_Model_DbTable_Tramitelistas();
		return $Table->getAdjuntosTramite($codtramitelista);
	}
	
	/**
	 * Elimina el documento adjunto de una sección
	 * @param integer Código del documento
	 */
	public function eliminarAdjuntoTramite($coddocumento) {
		$adjunto = new Generales_Model_Documentos();
		$adjunto->eliminarDocumento($coddocumento);
	}
	
	/**
	 * Obtiene los datos del responsable del plan de mejoramiento del programa
	 * @param Integer $codprograma Código del programa
	 */
	public function getResponsablePlan($codprograma) {
		$Table = new Listas_Model_DbTable_Tramitelistas();
        $datos_responsable = $Table->getResponsablePlan($codprograma);
        
		if(count($datos_responsable)>0){
		    return $datos_responsable[0];
		}else{
            $Table->getAdapter()->insert("responsableplanmejoramiento_cna", array("codprograma"=>$codprograma));
            $datos_responsable = $Table->getResponsablePlan($codprograma);
            return $datos_responsable[0];
		}
	}
	
	/**
	 * Obtiene los datos del responsable del plan de mejoramiento del programa
	 * @param Integer $codprograma Código del programa
	 */
	public function guardarResponsablePlan($datos) {
	    $codresponsable = $datos["codresponsable"];
	    unset($datos["codresponsable"]);
		$Table = new Listas_Model_DbTable_Tramitelistas();
        $Table->getAdapter()->update("responsableplanmejoramiento_cna",$datos,"codresponsable={$codresponsable}");
	}
	
	/**
	 * Obtiene los factores en un array
	 * @param Array $datos Datos
	 */
	public function getArrayFactores($datos) {
	    $array_factores = array();
	    foreach($datos as $key =>$valor ){
	        $array_factores[$valor["codtramiteseccion"]]=$valor["nombre"];
	    }
	    return $array_factores;
	}
	
	/**
	 * Almacena los datos de una actividad del plan de mejoramiento
	 * @param array $datos Los datos de la actividad
	 */
	public function guardarActividadPlan($datos) {
	    $datos = $this->forceEmptyAsNull($datos);
		$Table = new Solicitudes_Model_DbTable_ActividadesPlan();

		if(isset($datos["codactividad"]) && !empty($datos["codactividad"])) {
			$row = $Table->find($datos["codactividad"])->current();
			return $row->setFromArray($datos)->save();
		} else {
			unset($datos["codactividad"]);
			$key = $Table->createRow($datos)->save();
			return $key;
		}
	}
	
	/**
	 * Obtiene los datos de una actividad
	 * @param Integer $codactividad Código de la actividad
	 * @return Array con los datos de la actividad
	 */
	public function getActividadPlan($codactividad){
	    $Table = new Solicitudes_Model_DbTable_ActividadesPlan();
		return $Table->find($codactividad)->current()->toArray();
	}
	
	/**
	 * Obtiene los datos de las actividades del plan de mejoramiento
	 * @param Integer $codproceso Código del proceso
	 * @return Array con los datos de las actividades
	 */
	public function getActividadesPlan($codproceso){
	    $Table = new Solicitudes_Model_DbTable_ActividadesPlan();
		return $Table->getActividadesPlan($codproceso);
	}
	/**
	 * Obtiene el número de las actividades del plan de mejoramiento
	 * @param Integer $codproceso Código del proceso
	 * @return Integer Cantidad de las actividades
	 */
	public function getCountActividadesPlan($codproceso){
	    $actividades = $this->getActividadesPlan($codproceso);
	    return count($actividades);
	}
	
	/**
	 * Elimina un recurso de un proceso
	 * @param integer $codrecursoproceso Código del recurso
	 */
	
	public function eliminarActividadPlan($codactividad){
	    $Table = new Solicitudes_Model_DbTable_ActividadesPlan();
	    $Table->delete("codactividad={$codactividad}");
	}
	
	/**
	 * Elimina el documento adjunto de una activadad del plan
	 * @param integer Código del documento
	 * @return bool
	 */
	public function eliminarAdjuntoActividad($coddocumento) {
        $adjunto = new Generales_Model_Documentos();
	    $adjunto->eliminarDocumento($coddocumento);
	}
	/**
	 * Almacena los datos de un archivo adjunto de una activadad del plan
	 * @param array $datos Los datos para el registro
	 */
	public function guardarAdjuntoActividad($datos) {
		$adjuntoTable = new Generales_Model_DbTable_Documentos();
	    $adjuntoTable->getAdapter()->beginTransaction();
		try {
			$key = $adjuntoTable->createRow($datos)->save();
			$datos_rel["coddocumento"] = $key;
			$datos_rel["codactividad"] = $datos["codactividad"];
			$adjuntoTable->getAdapter()->insert("documentosactividadesplan_cna", $datos_rel);
			$adjuntoTable->getAdapter()->commit();
		} catch(Exception $e) {
			$adjuntoTable->getAdapter()->rollBack();
			throw $e;
		}
	}
	
	/**
	 * Obtiene un array con la lista de documentos adjuntos de una activadad del plan
	 * @param $codsintesis Código de la síntesis
	 * @return array
	 */
	public function getAdjuntosActividad($codactividad) {
		$SolicitudTable = new Solicitudes_Model_DbTable_ActividadesPlan();
		return $SolicitudTable->getAdjuntosActividad($codactividad);
	}
	
	/**
	 * Elimina la ponderación y la valoración
	 * @param Integer $codtramitelista Código de diligenciamiento de la lista
	 */
	public function resetearValoracion($codtramitelista){
	    $Table = new Listas_Model_DbTable_Tramitelistas();
        $Table->resetearValoracion($codtramitelista);
	}
}//fin de la clase